\documentclass{article}
\usepackage{ctex}
\usepackage{geometry}
\usepackage{ragged2e}
\usepackage{graphicx}
\usepackage{enumerate}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
  basicstyle=\ttfamily\small,    % 等宽字体
  numbers=left,                   % 显示行号
  numberstyle=\tiny\color{gray},  % 行号样式
  frame=single,                   % 边框样式
  breaklines=true,                % 自动换行
  keywordstyle=\color{blue},      % 关键字颜色
  commentstyle=\color{green!40!black}, % 注释颜色
  stringstyle=\color{red}         % 字符串颜色
}
\geometry{a4paper,scale=0.7}
\title{传感器与ADC实验报告}
\author{赵俊宇 PB24061271}
\date{2025.4.12}
\begin{document}
\maketitle
\tableofcontents
\section{温湿度传感器与超声波传感器核心代码}
使用设计好的头文件,我们可以通过这些传感器获得数据.
我们编程的重点在于设法使用这些数据,这里表现为转化成字符串显示在LCD上.
\begin{lstlisting}[language=C]
    LCD_Write_NewChar('0'+dht11_data[0]/10%10);
    LCD_Write_NewChar('0'+dht11_data[0]%10);
\end{lstlisting}

其中,在显示之前,需要对数据进行校验,这里表现为加和.
\begin{lstlisting}[language=C]
    if(dht11_data[4]==dht11_data[0]+dht11_data[1]+dht11_data[2]+dht11_data[3])
\end{lstlisting}

对于超声波传感器,传输的数据更长,仍然需要转化为字符串.
\begin{lstlisting}[language=C]
    while(distance>0){
		uc_d =distance%10 +'0';
		LCD_Write_Char(0,i,uc_d);
		i--;
		distance /=10;
	}
\end{lstlisting}
需要注意的是,在接收数据的过程中,程序不可以被中断,原因是获取数据的时间是固定的,而中断会影响这一过程.
\begin{lstlisting}[language=C]
    cli();
    sei();
\end{lstlisting}

\section{通过模拟数字转换器计算电压}
开启连续模式,右对齐,设置预分频后,可以开始转换ADC.
通过采样计算,可以获得该管脚的电压.

为了能获得AO和DO的电压,我们让MCU在一个循环内分别对PC3和PC2发起采样并计算.
获得数据后,再使用代码转化为字符串显示在LCD上.

由于我们获得了两次数据,这个处理过程就需要进行两次.处理整数位,我们可以使用如下代码:
\begin{lstlisting}[language=C]
    uc_display[3]='0';
	while(uc_int>0 && i>0){
		uc_display[i--]=uc_int%10+'0';
		uc_int /=10;	
	}
	if(i==2) uc_display[i]='0';
	uc_display[3]='.';
\end{lstlisting}

小数部分可以这样处理:
\begin{lstlisting}[language=C]
    while(adc_result>0 && i<7){
		adc_result *=10;
		uc_int =(unsigned char) adc_result;
		adc_result -=uc_int;
		uc_display[i++]=uc_int+'0';
	}
	c_display[7]=0;
\end{lstlisting}
\section{一种debug方式}
硬件显示能否正常工作的方式并不显然,可以使用代码构造一个反复切换状态的状态机来提示这一点.
\begin{lstlisting}[language=C]
    if (toggle)
	{
		LCD_Write_Char(0,15,'$');
		toggle=0;
	}
	else{
		LCD_Write_Char(0,15,' ');
		toggle=1;
	}
	_delay_ms(300);
\end{lstlisting}
\end{document}